package com.example.datamanage.controller;

import com.example.datamanage.common.DataTypeEnum;
import com.example.datamanage.common.Result;
import com.example.datamanage.pojo.Connect;
import com.example.datamanage.pojo.dto.DataSourceDTO;
import com.example.datamanage.pojo.dto.SearchDTO;
import com.example.datamanage.service.ConnectService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

/**
 * @author 28142
 * @description 连接 controller
 * @date 2023/7/24 16:37
 */
@RestController
@RequestMapping("/conn")
public class ConnectController {
    @Autowired
    private ConnectService connectService;

    /**
     * 创建并切换数据源
     * @author 杨雨盛
     * @date 2023/7/25 13:38
     * @param dataSourceDTO
     * @return com.example.datamanage.common.Result
     */
    @PostMapping("/switch")
    public Result createConn(@Valid @RequestBody DataSourceDTO dataSourceDTO) throws NoSuchFieldException, IllegalAccessException {
        System.out.println(dataSourceDTO);
        return connectService.createConn(dataSourceDTO) ? Result.success() : Result.error();
    }

    /**
     * 根据数据库类型和系统名称查询数据源表并切换数据源
     * @author 杨雨盛
     * @date 2023/8/2 17:16
     * @param dataType
     * @param name
     * @return com.example.datamanage.common.Result
     */
    @GetMapping("/switch/{dataType}/{name}")
    public Result switchDatasource(@PathVariable String dataType,
                                   @PathVariable String name) throws NoSuchFieldException, IllegalAccessException {
        return connectService.switchDatasource(dataType, name);
    }

    /**
     * 测试连接数据源
     * @author 杨雨盛
     * @date 2023/7/25 13:39
     * @param dataSourceDTO
     * @return com.example.datamanage.common.Result
     */
    @PostMapping("/test")
    public Result testConn(@Valid @RequestBody DataSourceDTO dataSourceDTO) {
        return connectService.testConn(dataSourceDTO) ? Result.success() : Result.error();
    }

    /**
     * 查询所有连接
     * @author 杨雨盛
     * @date 2023/7/24 23:49
     * @return com.example.datamanage.common.Result
     */
    @GetMapping
    public Result findAllConn() {
        return Result.success(connectService.list());
    }

    /**
     * 分页条件查询
     * @author 杨雨盛
     * @date 2023/7/25 0:07
     * @param pageNum
     * @param pageSize
     * @param searchDTO
     * @return com.example.datamanage.common.Result
     */
    @GetMapping("/{pageNum}/{pageSize}")
    public Result findPage(@PathVariable Integer pageNum,
                           @PathVariable Integer pageSize,
                           SearchDTO searchDTO) {
        return connectService.findPage(pageNum, pageSize, searchDTO);
    }

    /**
     * 添加或修改数据源
     * @author 杨雨盛
     * @date 2023/7/25 0:08
     * @param connect
     * @return com.example.datamanage.common.Result
     */
    @PostMapping
    public Result saveConn(@Valid @RequestBody Connect connect) {
        return connectService.saveConn(connect) ? Result.success() : Result.error();
    }

    /**
     *
     * 根据id删除数据源
     * @author 杨雨盛
     * @date 2023/7/25 9:09
     * @param id
     * @return com.example.datamanage.common.Result
     */
    @DeleteMapping("/{id}")
    public Result delConn(@PathVariable Integer id) {
        return connectService.removeById(id) ? Result.success() : Result.error();
    }

    /**
     * 批量删除数据源
     * @author 杨雨盛
     * @date 2023/7/25 9:09
     * @param ids
     * @return com.example.datamanage.common.Result
     */
    @DeleteMapping
    public Result batchDelConn(@RequestBody List<Integer> ids) {
        return connectService.removeByIds(ids) ? Result.success() : Result.error();
    }

    /**
     * 获取所有数据库类型
     * @author 杨雨盛
     * @date 2023/7/25 9:51
     * @return com.example.datamanage.common.Result
     */
    @GetMapping("/type")
    public Result getAllType() {
        return Result.success(DataTypeEnum.getDataTypeEnum());
    }

    /**
     * 根据数据库类型查询系统名称
     * @author 杨雨盛
     * @date 2023/7/27 11:39
     * @param dataType
     * @return com.example.datamanage.common.Result
     */
    @GetMapping("/name/{dataType}")
    public Result getNameByDataType(@PathVariable String dataType) {
        return connectService.getNameByDataType(dataType);
    }

    /**
     * 根据数据库类型和系统名称查询数据库名
     * @author 杨雨盛
     * @date 2023/7/27 11:39
     * @param dataType
     * @param name
     * @return com.example.datamanage.common.Result
     */
    @GetMapping("/dataName/{dataType}/{name}")
    public Result getDataNameByDataTypeAndName(@PathVariable String dataType,
                                               @PathVariable String name) {
        return connectService.getDataNameByDataTypeAndName(dataType, name);
    }

    @GetMapping("/one")
    public Result getConn(@Valid SearchDTO searchDTO) {
        return connectService.getConn(searchDTO);
    }
}
